home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
t_os
/
ami_sys
/
ovl_src
/
test1.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-30
|
4KB
|
124 lines
/**/
/* オーバレイライブラリによって呼び出されるプログラム例です */
/* デジタイズします */
/* 今のところamiシステムではDTA(Data Transfer Area)を使っていません */
/* VRAM を通してインタフェースを取ります */
/* HIGH C のマニュアルでは */
/* EGB_dezitize() が EGB_digitize() になってから注意 */
/* どなたか分からなくなったのですがNIFTYのTOWNSフオーラムに書き込んで*/
/* あった方法でデジタイズしています */
/* ハンドル名忘れてしまってスイマセン */
/* 御陰で助かりました */
/**/
#include <string.h>
#include <stdlib.h>
#include <msdos.cf>
#include <egb.h>
#include <mos.h>
#include <loader.h> /* pcl_exit() を使うため */
/* 拡張ライブラリ1 があった方がよい */
#define GETVRAM(buf, x1,y1,x2,y2) \
{ struct {char *bp; short sel; short sx,sy,ex,ey;} p; \
p.bp=(char *)buf; p.sel=getds(); \
p.sx=x1;p.sy=y1;p.ex=x2;p.ey=y2; \
EGB_writePage(gwork,0); \
EGB_getBlock( gwork, (char *)&p ); }
#define PUTVRAM(buf, x1,y1,x2,y2) \
{ struct {char *bp; short sel; short sx,sy,ex,ey;} p; \
p.bp=(char *)buf; p.sel=getds() ; \
p.sx=x1;p.sy=y1;p.ex=x2;p.ey=y2; \
EGB_putBlock( gwork, 0, (char *)&p ); }
char *gwork; /* EGB用 ワーク領域 */
char *mwork; /* MOS用 ワーク領域 */
short (*vram)[320] ; /* VRAMの複写領域 */
void screen_get()
{
/* 最初は EGB_init を使わないで画面設定します */
memset( gwork, 0, EgbWorkSize ); /* 念のため0クリア */
EGB_displayPage(gwork,0,0); /* 意味ないかもしれない */
EGB_resolution(gwork,0,10); /* page=0; 32Kmode */
EGB_resolution(gwork,1, 3); /* page=1; 16mode */
EGB_writePage( gwork,0);
GETVRAM(&vram[0][0],0,0,319,239); /* VRAMをワーク領域に複写 */
}
void screen_set()
{
EGB_init(gwork,EgbWorkSize); /* 改めて正式に初期化します */
EGB_resolution(gwork,0, 9); /* page=0; 32Kmode */
EGB_resolution(gwork,1, 9); /* page=1; 32Kmode */
EGB_writePage(gwork,0); /* page0 設定 */
EGB_displayStart(gwork,3,0,0);
EGB_displayStart(gwork,2,1,1);
EGB_displayStart(gwork,0,0,0);
EGB_displayStart(gwork,1,0,0);
EGB_displayStart(gwork,3,320,240);
EGB_writePage(gwork,1); /* page1 設定 */
EGB_displayStart(gwork,3,0,0);
EGB_displayStart(gwork,2,1,1);
EGB_displayStart(gwork,0,0,0);
EGB_displayStart(gwork,1,0,0);
EGB_displayStart(gwork,3,320,240);
EGB_displayPage(gwork,0,3); /* page1 前 */
return ;
}
void start_dezitize()
{
static st;
int b,x,y;
st=1; /* 最初はデジタイズON */
EGB_writePage(gwork, 0 );
EGB_dezitize( gwork,st );
while( 1 ) {
MOS_rdpos(&b,&x,&y) ;
switch( b ) {
case 0: break;
case 1: /* マウス左ボタンでデジタイズ */
st=((st==0)?1:0);
EGB_dezitize( gwork,st );
do{ MOS_rdpos(&b,&x,&y) ;} while(b==1);
break;
default: /* 右ボタンでリターン */
return;
}
}
}
void main(void)
{
int x,y;
vram=malloc( 240*320* sizeof(short) );
if(vram==NULL) return ;
gwork=malloc( EgbWorkSize*sizeof(char) );
if(gwork==NULL) return ;
mwork=malloc( MosWorkSize*sizeof(char) );
if(mwork==NULL) return ;
screen_get(); /* 意味ないが形式的に書いてある */
screen_set(); /* インタレースモードに設定 */
/* スーパインポーズビット設定 */
for(y=0; y<120; y++ )
for( x=0; x<320; x++ )
vram[y][x] |= 0x8000;
EGB_writePage(gwork, 0);
EGB_writeMode(gwork, 0);
PUTVRAM(&vram[0][0],0,0,319,239);
EGB_writePage(gwork, 1);
PUTVRAM(&vram[0][0],0,0,319,239);
MOS_start(mwork,MosWorkSize);
start_dezitize();
MOS_end();
pcl_exit(0);
return ;
}